#include "t_webViewForm.h"


QPrinter *t_webViewForm::posbPrinter=0;

//--------------------------------------------------------------------------
t_webViewForm::t_webViewForm(QObject *parent) :
    QObject(parent)
{
    cWebView = new QWebView();
    prDialog = new QPrintPreviewDialog(t_webViewForm::getPrinter());
    connect(prDialog,SIGNAL(paintRequested(QPrinter*)),this,SLOT(printPreviewNeeds(QPrinter*)));
    setHtml("");// ВАЖНО! тут создаются кнопки
}

//--------------------------------------------------------------------------
void t_webViewForm::printPreview()//запустить окно предварительной печати
{
    prDialog->exec();
}

void t_webViewForm::printNow()//запустить окно предварительной печати
{
    QPrintDialog *dialog = new QPrintDialog(t_webViewForm::getPrinter());
    dialog->setWindowTitle(tr("Выберите принтер"));
    //if (textEditField->textCursor().hasSelection())
    dialog->addEnabledOption(QAbstractPrintDialog::PrintSelection);

    if (dialog->exec() == QDialog::Accepted)
        {
            cWebView->print(t_webViewForm::getPrinter());
        };
        //return;
    dialog->deleteLater();
}


////--------------------------------------------------------------------------
////формируем стандартную, универсальную форму отчета.
//QString t_webViewForm::generateForm(t_infoObject_v *iObject,QString formatName)
//{   QString cRez="",cMetaDataFieldRec,cMetaDataTableRec,cFieldRusName,cTableRusName;
//    if (formatName.isEmpty()) formatName="HTML.v1";
//    if (fillTemplate(formatName)<0)
//        {
//            QString errorMsg=QString("ERROR:t_webViewForm::generateForm()[00017] :Can`t find template name [%1].").arg(formatName);
//            qDebug() << errorMsg;
//            return errorMsg;
//        };
//     cRez.append("");

//    //Выведем данные шапки
//      QStringList headFields = iObject->MDR()->get_headOrder();

//      cRez +=  tMap["PageHeader"].arg(    QString(" АС 'Оценка Проекта'. документ '%1' №%2. дата печати:[%3]").arg(iObject->MDR()->get_infoTypeRusName()).arg(iObject->value("id").toString()).arg(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm") )    ) ;//верхний колонтитул
//      cRez +=  tMap["hr"];
//      cRez +=  tMap["HeaderIdName"].arg(iObject->value("id").toString()).arg(iObject->value("name").toString());
//      cRez +=  tMap["hr"];
//      cRez +=  tMap["DocHead_TableHead_2Col_v1"];
//      for (int i = 0; i < headFields.size(); ++i)
//        {
//           cMetaDataFieldRec = iObject->MDR()->get_headFieldType(headFields.at(i));
//           cFieldRusName = t_metadataRec::get_rusNameFromFieldType(cMetaDataFieldRec);
//           cRez +=  tMap["DocHead_TableString_2Col_v1"].arg(cFieldRusName).arg(iObject->value(headFields.at(i)).toString().replace("\n","<br>"));
//        };
//      cRez +=  tMap["DocHead_TableBottom_2Col_v1"];
//      cRez +=  tMap["br"];
//      cRez +=  tMap["hr"];



//    //проба выборки табличной части
//    QString cTablePartName, cTableFieldName;//="messages";
//    t_table *table;
//    QStringList cTableParts = iObject->MDR()->get_tablePartsOrder();
//    QStringList cTablePartFields;//=iObject->MDR()->get_HeadFields()

//    foreach (cTablePartName, cTableParts)
//        {
//          cMetaDataTableRec=iObject->MDR()->get_tablePartMetaData(cTablePartName);
//          cTableRusName=t_metadataRec::get_rusNameFromFieldType(cMetaDataTableRec);
//          cRez +=  tMap["DocTable_TablePartHead"].arg(cTableRusName);//заголовок большими буквами
//          cRez +=  tMap["DocTable_TableHead"];

//          cTablePartFields=iObject->MDR()->get_tablePartFieldOrder(cTablePartName);

//          //перебираем поля таблицы. рисуем заголовки таблицы.
//          cRez +=  tMap["DocTable_TableHeadRowBegin"]; //начало строки данных
//          foreach(cTableFieldName, cTablePartFields)
//              {
//                  cMetaDataFieldRec=iObject->MDR()->get_tablePartFieldType(cTablePartName,cTableFieldName);
//                  if (cTableFieldName=="id") continue;
//                  if (t_metadataRec::get_flagsFromMetaDataDescr(cMetaDataFieldRec).contains("HIDDEN"))
//                          continue;
//                  cFieldRusName = t_metadataRec::get_rusNameFromFieldType(cMetaDataFieldRec);
//                  cRez +=  tMap["DocTable_TableHeadCell_1Cell"].arg(cFieldRusName);
//              };
//          cRez +=  tMap["DocTable_TableHeadRowEnd"]; //конец строки данных

//          //теперь рисуем строки
//          table = iObject->getTableSpace(cTablePartName);
//          if ( table->isActive() )
//             {
//                if (table->first())
//                 do {
//                        //перебираем поля таблицы. без оптимизации пока и медленно...
//                        cRez +=  tMap["DocTable_TableRowBegin"]; //начало строки данных
//                        foreach(cTableFieldName, cTablePartFields)
//                            {
//                                cMetaDataFieldRec=iObject->MDR()->get_tablePartFieldType(cTablePartName,cTableFieldName);
//                                if (cTableFieldName=="id") continue;
//                                if (t_metadataRec::get_flagsFromMetaDataDescr(cMetaDataFieldRec).contains("HIDDEN"))
//                                        continue;
//                                //cFieldRusName = t_metadataRec::get_rusNameFromFieldType(cMetaDataFieldRec);
//                                cRez +=  tMap["DocTable_TableCell_1Cell"].arg(table->value(cTableFieldName).toString().replace("\n","<br>"));
//                            };
//                        cRez +=  tMap["DocTable_TableRowEnd"]; //конецСтроки данных

//                    } while (table->next());
//             };
//          cRez +=  tMap["DocTable_TableBottom"];

//      };//foreach (tablePartName, tableParts)
//      qDebug() << cRez;


//      cWebView->setText(cRez);

//      return cRez;
//}
//--------------------------------------------------------------------------
void t_webViewForm::printAndExportWiki()
{
    //QMessageBox::
    qDebug()<< "INFO: t_webViewForm::printAndExportWiki()[00130] is not done yet";
}

//--------------------------------------------------------------------------
void t_webViewForm::printPreviewNeeds(QPrinter *_printer)
{
    cWebView->print(_printer);
}


//--------------------------------------------------------------------------
// ++2010.08.12
//показать диалог с кнопками печати препросмотра и др. быстрый вариант для скрипта.
//для HTML-текста
int t_webViewForm::show(QString htmltext)
{
    setHtml(QStringList(htmltext))->show(); //exec()
    setButtonsVisible(buttonsAreVisible);
    return 0;;
}

//--------------------------------------------------------------------------
// ++2010.08.12
//отдать диалог с кнопками печати препросмотра и др. - вариант для HTML-текста
QDialog *t_webViewForm::setHtml(QString htmltext)
{
    return setHtml(QStringList(htmltext));
}

QDialog *t_webViewForm::setHtml(QStringList htmlTextList)
{
    cWebView->page()->deleteLater();
    cWPage=new t_advWebPage();
    cWebView->setPage(cWPage);
    //cWPage->setContentEditable(true);//2011.04.13 probe
    cWPage->settings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls,true);
    cWPage->settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls,true);
    cWPage->settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled,true);
    cWPage->settings()->setAttribute(QWebSettings::LocalStorageEnabled,true);


    connect(cWPage, SIGNAL(urlClick(QWebFrame*, QUrl, QWebPage::NavigationType)), this, SIGNAL(urlClick(QWebFrame*, QUrl, QWebPage::NavigationType)));
    connect(cWPage, SIGNAL(evaluate(QWebFrame*, QString)), this, SIGNAL(evaluate(QWebFrame*, QString)));
    connect(cWPage, SIGNAL(reloadSection(QWebFrame*, QString)), this, SIGNAL(reloadSection(QWebFrame*, QString)));

    cWPage->mainFrame()->setHtml("");
    QStringList tmpStrL;//cWebView->setHtml("");

    tmpStrL=htmlTextList;
    while (tmpStrL.size()>0)
        cWPage->mainFrame()->setHtml(tmpStrL.takeFirst());

    shContainer = new QDialog();
    shContainer->setObjectName("U_InfoObjectPrintForm");

    //панелька интсрументов.
    toolBar=new QToolBar (shContainer);
    //toolBar->setIconSize(QSize(24,24));
    toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    QAction *objAction;

    objAction = toolBar->addAction( "printPreview");
    objAction->setEnabled(true);
    QIcon ico=QIcon(":icon_printPreview");
    objAction->setIcon(ico);
    objAction->setIconText("Препросмотр");
    objAction->setToolTip("Препросмотр Печатной формы");//всплывающая подсказка на кнопке?
    objAction->setStatusTip("Препросмотр Печатной формы");//сообщ. в строке статуса в главном окне
    objAction->setParent(toolBar);//что бы грхался когда виджет удаляем.
    connect(objAction, SIGNAL(triggered()), this,SLOT(printPreview()));

    objAction = toolBar->addAction(QIcon(":/icons/printer.png"), "print");//:icon_print"), "print");
    objAction->setIconText("Печать");
    //objAction->setEnabled(true);
    //objAction->setStatusTip("Печать");//сообщ. в строке статуса в главном окне
    //objAction->setToolTip("Печать");//всплывающая подсказка на кнопке?
    //objAction->setParent(toolBar);//что бы грхался когда виджет удаляем.
    connect(objAction, SIGNAL(triggered()), this,SLOT(printNow()));

    objAction = toolBar->addAction(QIcon(":icon_saveAsFile"), "save");
    objAction->setEnabled(false);
    objAction->setIconText("Сохранить");
    objAction->setStatusTip("Сохранить");//сообщ. в строке статуса в главном окне
    objAction->setToolTip("Сохранить");//всплывающая подсказка на кнопке?
    objAction->setParent(toolBar);//что бы грхался когда виджет удаляем.
    //connect(objAction, SIGNAL(triggered()), this,SLOT(saveToFile()));

    objAction = toolBar->addAction(QIcon(":icon_export"), "export");
    objAction->setEnabled(false);
    objAction->setIconText("Экспорт в wiki");
    objAction->setText("Экспорт в wiki");
    objAction->setStatusTip("Экспорт в wiki");//сообщ. в строке статуса в главном окне
    objAction->setToolTip("Экспорт в wiki");//всплывающая подсказка на кнопке?
    objAction->setParent(toolBar);//что бы грхался когда виджет удаляем.
    //connect(objAction, SIGNAL(triggered()), this,SLOT(saveToFile()));

    objAction = toolBar->addAction(QIcon(":icon_close"), "close");
    objAction->setIconText("Закрыть");
    objAction->setEnabled(true);
    objAction->setStatusTip("Закрыть");//сообщ. в строке статуса в главном окне
    objAction->setToolTip("Закрыть");//всплывающая подсказка на кнопке?
    objAction->setParent(toolBar);//что бы грхался когда виджет удаляем.
    connect(objAction, SIGNAL(triggered()), shContainer,SLOT(close()));

    //QPushButton * doPrivewAndPrint= new QPushButton(shContainer);
    //doPrivewAndPrint->setIcon(ico);

/*/
    doPrivewAndPrint= new QPushButton(shContainer);
    doPrivewAndPrint->setObjectName("PrivewAndPrint_button");
    doPrivewAndPrint->setText("Препросмотр\n и печать");
    QObject::connect(doPrivewAndPrint,SIGNAL(clicked()),this,SLOT(printPreview()));

    doPrint= new QPushButton(shContainer);
    doPrint->setObjectName("Print_button");
    doPrint->setText("Печать\n");
    QObject::connect(doPrint,SIGNAL(clicked()),this,SLOT(printNow()));

    doWiki= new QPushButton(shContainer);
    doWiki->setObjectName("WikiPrint_button");
    doWiki->setText("Публиковать\n MediaWiki");
    doWiki->setEnabled(false);
    QObject::connect(doWiki,SIGNAL(clicked()),this,SLOT(printAndExportWiki()));

    doExit= new QPushButton(shContainer);
    doExit->setObjectName("Exit_button");
    doExit->setText("Закрыть\n");
    QObject::connect(doExit,SIGNAL(clicked()),shContainer,SLOT(close()));
/**/
    //t_dispatcher::getPrinter()

//      QTextBrowser *cRepShower=new QTextBrowser(shContainer);
//      cRepShower->setObjectName("ReportBrowser");

//      cRepShower->setHtml("");
//      tmpStrL=htmlTextList;
//      while (tmpStrL.size()>0)
//          cRepShower->insertHtml(tmpStrL.takeFirst());
    //QWebView *cRepShower=cWebView;

      //cRepShower->show();

    //cWebView->setStyleSheet("QWebView {padding: 2px; border-style: outset; border-width: 1px; border-radius: 3px; border-color: grey; background-color: white;}");

    static QString style_infoObj_widget_textField_EditButton="QToolButton { padding: 2px; border-style: outset; border-width: 1px; border-radius: 3px; border-color: grey; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #f6f7fa, stop: 1 #dadbde);}\
                                                              QToolButton:hover { padding: 2px;  border-style: outset; border-width: 1px; border-radius: 3px; border-color: grey; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 white, stop: 1 yellow);}\
                                                              QToolButton:pressed { padding-left: 4px; padding-top: 4px;  border-style: inset; border-width: 1px; border-radius: 3px; border-color: grey; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 white, stop: 1 yellow);}\
    ";

    shContainer->setStyleSheet(style_infoObj_widget_textField_EditButton);

    boxLayut=new QGridLayout(shContainer);

    boxLayut->addWidget(toolBar,0,0,1,9);
    boxLayut->addWidget(cWebView,1,0,8,9);

   // boxLayut->addWidget(doPrivewAndPrint,9,1,1,1);
   // boxLayut->addWidget(doPrint,9,2,1,1);
   // boxLayut->addWidget(doWiki,9,4,1,1);
   // boxLayut->addWidget(doExit,9,7,1,1);
    shContainer->setLayout(boxLayut);

    shContainer->resize(800,600);
    shContainer->layout()->setSpacing(3);
    shContainer->layout()->setMargin(3);
    setButtonsVisible(buttonsAreVisible);
    return shContainer;
}

//--------------------------------------------------------------------------
void t_webViewForm::setButtonsVisible(bool _buttonsAreVisible)
    {
        buttonsAreVisible=_buttonsAreVisible;
        toolBar->setVisible(buttonsAreVisible);
        //doPrivewAndPrint->setVisible(buttonsAreVisible);
        //doPrint->setVisible(buttonsAreVisible);
        //doWiki->setVisible(buttonsAreVisible);
        //doExit->setVisible(buttonsAreVisible);
        return ;
    }

//--------------------------------------------------------------------------
//проверяем существует ли элемент с таким именем на странице
//имя элмента должно быть в стиле CSS - с # начале.
bool t_webViewForm::isElementPresent(QString elementName)
    {
        QWebElement elem =this->cWebView->page()->mainFrame()->findFirstElement(elementName);
        if (elem.isNull())
            return false;
        return true;
    }

//--------------------------------------------------------------------------
int t_webViewForm::setElementValue(QString elementName, QString elementValue)
    {
        QWebElement elem =this->cWebView->page()->mainFrame()->findFirstElement(elementName);
        if (elem.isNull())
            return -1;
        // QVariant rez=elem.evaluateJavaScript("this.value=\""+elementValue+"\"").toInt();
        QString jsVal=elementValue;
        jsVal.replace("\\","\\\\");//надо заэскейпиться
        jsVal.replace("\"","\\\"");//надо заэскейпиться
        jsVal.replace("\n","\\\n");//надо заэскейпиться

        QString jsCom="this.value=\""+jsVal+"\"";
        QVariant rez=elem.evaluateJavaScript(jsCom);
        // НАДО ПОНИМАТЬ ТУТ - БЫЛА ЛИ У НАС ОШИБКА ПИ ИСПОЛНЕНИИ ЭТОГО JavScript ИЛИ НЕТ?! НО КАК?
        return 0;
    }

//--------------------------------------------------------------------------
QString t_webViewForm::getElementValue(QString elementName)
    {
        QWebElement elem =this->cWebView->page()->mainFrame()->findFirstElement(elementName);
        if (elem.isNull())
            return QString();
        QString retValue=elem.evaluateJavaScript("this.value").toString();
        if (elem.tagName().toLower()=="input")
            {
                if (elem.attribute("type","").toLower()=="checkbox")
                    retValue=elem.evaluateJavaScript("this.checked").toString();
                //combobox и text распознаются через this.value нормально
                // radio - не проверен.
            };
        return retValue;
    }

//--------------------------------------------------------------------------
int t_webViewForm::setElementInnerHTML(QString elementName, QString elementValue)
    {
        QWebElement elem =this->cWebView->page()->mainFrame()->findFirstElement(elementName);
        if (elem.isNull())
            return -1;
        //QVariant rez=elem.evaluateJavaScript("try { this.innerHTML=\""+elementValue+"\"; } catch (e) { alert(e);}");
        QString jsVal=elementValue;
        jsVal.replace("\\","\\\\");//надо заэскейпиться
        jsVal.replace("\"","\\\"");//надо заэскейпиться
        jsVal.replace("\n","\\\n");//надо заэскейпиться

        QString jsCom="this.innerHTML=\""+jsVal+"\"";
        QVariant rez=elem.evaluateJavaScript(jsCom);
        // НАДО ПОНИМАТЬ ТУТ - БЫЛА ЛИ У НАС ОШИБКА ПИ ИСПОЛНЕНИИ ЭТОГО JavScript ИЛИ НЕТ?! НО КАК?
        return rez.toInt();
    }

//--------------------------------------------------------------------------
QString t_webViewForm::getElementInnerHTML(QString elementName)
    {
        QWebElement elem =this->cWebView->page()->mainFrame()->findFirstElement(elementName);
        if (elem.isNull())
            return QString();
        return elem.evaluateJavaScript("this.innerHTML").toString();
    }

//--------------------------------------------------------------------------
//
int t_webViewForm::setElementAttribute(QString elementName, QString attributeName, QString elementValue)
    {
        QWebElement elem =this->cWebView->page()->mainFrame()->findFirstElement(elementName);
        if (elem.isNull())
            return -1;
        QVariant retV=elem.evaluateJavaScript(QString("this.%1='%2'").arg(attributeName).arg(elementValue)).toString();
        return retV.toInt();
    }

//--------------------------------------------------------------------------
QString t_webViewForm::getElementAttribute(QString elementName, QString attributeName) //если атрибута нет - отдается null значение (QString::isNull()==true)
    {
        QWebElement elem =this->cWebView->page()->mainFrame()->findFirstElement(elementName);
        if (elem.isNull())
            return QString();
        return elem.evaluateJavaScript(QString("this.%1").arg(attributeName)).toString();
    }

//--------------------------------------------------------------------------
void t_webViewForm::setWindowTitle(QString winTitle)
    {
        shContainer->setWindowTitle(winTitle);
        return;
    };


//--------------------------------------------------------------------------
//ах какой (бы) был слон... но QWebWiew не stylable/
/*/
void t_webViewForm::setWindowStyleSheet(QString StyleSheet)
    {

        static QString style_infoObj_widget_textField_EditButton="QPushButton { padding: 2px; border-style: outset; border-width: 1px; border-radius: 3px; border-color: grey; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #f6f7fa, stop: 1 #dadbde);}\
                                                                  QPushButton:hover { padding: 2px;  border-style: outset; border-width: 1px; border-radius: 3px; border-color: grey; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 white, stop: 1 yellow);}\
                                                                  QPushButton:pressed { padding-left: 4px; padding-top: 4px;  border-style: inset; border-width: 1px; border-radius: 3px; border-color: grey; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 white, stop: 1 yellow);}\
        ";

        doExit->setStyleSheet(style_infoObj_widget_textField_EditButton);

        cWebView->setStyleSheet(StyleSheet);
        doPrivewAndPrint->setStyleSheet(StyleSheet);
        doPrint->setStyleSheet(StyleSheet);
        doWiki->setStyleSheet(StyleSheet);
        //doExit->setStyleSheet(StyleSheet);

        qDebug() << "setStyleSheet(StyleSheet);" + StyleSheet;
        return;
    };
/**/
//--------------------------------------------------------------------------
int t_webViewForm::fillTemplate(QString version)
{
    tMap.clear();
    if (version=="HTML.v1")
        {
            tMap.insert("PageHeader"  ,"%1");
            tMap.insert("PageFooter"  ,"%1");
            tMap.insert("HeaderIdName"  ,"<center><H1>#%1 %2</H1></center>");
            tMap.insert("Headerl2"      ,"<H2>#%1</H2>");
            tMap.insert("Headerl1"      ,"<H1>%1</H1>");
            tMap.insert("br"            ,"<br>");
            tMap.insert("hr"            ,"<hr>");
            tMap.insert("DocHead_TableHead_2Col_v1"  ,"<table>");
            tMap.insert("DocHead_TableString_2Col_v1"  ,"<tr><td><b>%1</b></td><td>%2</td></tr>");
            tMap.insert("DocHead_TableBottom_2Col_v1"  ,"</table>");

            tMap.insert("DocTable_TablePartHead"    ,"<H3>%1</H3>");

            tMap.insert("DocTable_TableHead"        ,"<table width=100% border=0 cellspacing=1 cellpadding=2 bgcolor=darkGrey style=\"border-collapse: collapse; border-width: 0px; border-style:solid; border-color: grey;\" >");

            tMap.insert("DocTable_TableHeadRowBegin"        ,"<tr>");
            tMap.insert("DocTable_TableHeadCell_1Cell"      ,"<td bgcolor=#CCCCCC ><b>%1</b></td>");
            tMap.insert("DocTable_TableHeadRowEnd"          ,"</tr>");

            tMap.insert("DocTable_TableRowBegin"        ,"<tr bgcolor=white>");
            tMap.insert("DocTable_TableCell_1Cell"      ,"<td>%1</td>");
            tMap.insert("DocTable_TableRowEnd"          ,"</tr>");

            tMap.insert("DocTable_TableBottom"          ,"</table>");

        };
    if (version=="HTML.v0")
        {
            tMap.insert("PageHeader"  ,"%1");
            tMap.insert("PageFooter"  ,"%1");
            tMap.insert("HeaderIdName"  ,"<center><H1>#%1 %2</H1></center>");
            tMap.insert("Headerl2"      ,"<H2>#%1</H2>");
            tMap.insert("Headerl1"      ,"<H1>%1</H1>");
            tMap.insert("br"            ,"<br>");
            tMap.insert("hr"            ,"<hr>");
            tMap.insert("DocHead_TableHead_2Col_v1"  ,"<table>");
            tMap.insert("DocHead_TableString_2Col_v1"  ,"<tr><td><b>%1</b></td><td>%2</td></tr>");
            tMap.insert("DocHead_TableBottom_2Col_v1"  ,"</table>");

            tMap.insert("DocTable_TablePartHead"    ,"<H3>%1</H3>");

            tMap.insert("DocTable_TableHead"    ,"<table border=1>");

            tMap.insert("DocTable_TableHeadRowBegin"        ,"<tr>");
            tMap.insert("DocTable_TableHeadCell_1Cell"      ,"<td><b>%1</b></td>");
            tMap.insert("DocTable_TableHeadRowEnd"          ,"</tr>");

            tMap.insert("DocTable_TableRowBegin"        ,"<tr>");
            tMap.insert("DocTable_TableCell_1Cell"      ,"<td>%1</td>");
            tMap.insert("DocTable_TableRowEnd"          ,"</tr>");

            tMap.insert("DocTable_TableBottom"          ,"</table>");

        };

}


//--------------------------------------------------------------------------
